package org.puc.enquete.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.puc.enquete.bean.Enquete;
import org.puc.enquete.bean.EnqueteView;
import org.puc.enquete.bean.FiltroEnquete;

/**
 * Esta é a classe que implementa o DAO da enquete
 */
class EnqueteDAO implements IEnqueteDAO {

    /**
     * Queries
     */

    private String SELECT = "SELECT E.ID, E.USUARIO, E.TITULO, E.DESCRICAO, "
            + "E.DATA_PUBLICACAO, E.DATA_ENCERRAMENTO, U.NOME, "
            + "(SELECT COUNT(V.ID) "
            + "    FROM VOTO V "
            + "      JOIN OPCAO O ON O.ID = V.OPCAO "
            + "    WHERE O.ENQUETE = E.ID) VOTOS "
            + "FROM ENQUETE E"
            + "  JOIN USUARIO U ON U.ID = E.USUARIO ";

    private String LISTAR = SELECT; //adicionar filtro

    /**
     * Dado um item do ResultSet, retorna um objeto EnqueteView
     */
    private EnqueteView preencheEnquete(ResultSet rs) throws SQLException {

        EnqueteView e = new EnqueteView();
        
        e.setId(rs.getInt("ID"));
        e.setUsuario(rs.getInt("USUARIO"));
        e.setTitulo(rs.getString("TITULO"));
        e.setDescricao(rs.getString("DESCRICAO"));
        e.setDataPublicacao(rs.getDate("DATA_PUBLICACAO"));
        e.setDataEncerramento(rs.getDate("DATA_ENCERRAMENTO"));
        e.setNomeUsuario(rs.getString("NOME"));
        e.setQuantidadeVotos(rs.getInt("VOTOS"));

        return e;

    }

    /**
     * Lista enquetes
     */
    public List<EnqueteView> listarEnquetes(FiltroEnquete filtro) {

        //cria uma lista vazia
        List<EnqueteView> lista = new ArrayList<EnqueteView>();

        Connection con = null;
        try {

            //inicia conexão
            con = AcessaBD.getConnection();

            //prepara a query
            PreparedStatement ps = con.prepareStatement(LISTAR);

            //executa a query
            ResultSet rs = ps.executeQuery();

            //recupera todos os itens
            while (rs.next()) {

                lista.add(preencheEnquete(rs));

            }

        } catch (Exception e) {

            //trata erros na execução
            e.printStackTrace();
            
        } finally {

            //finaliza conexão
            try {

                //fecha a conexão
                if (con != null) {

                    con.close();
                    
                }

            } catch (Exception e) {

                //trata erros no fechamento na conexão
                e.printStackTrace();

            }

            //retorna lista
            return lista;

        }

    }

    public void atualizarEnquete(Enquete e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void inserirEnquete(Enquete e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void excluirEnquete(int id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public EnqueteView consultarEnquete(int id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
